package com.hy.ximalaya.service;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hy.common.HttpUtils;
import com.hy.ximalaya.entity.Album;
import com.hy.ximalaya.entity.Track;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;

/**
 * 负责发送请求和维护ximalaya基础数据的核心类
 *
 * @author hy 2327401139@qq.com
 * @version 1.0 2021/10/16 16:26
 */
@Data
public class Ximalaya {

    /**
     * 专辑ID
     */
    private Integer albumId;

    /**
     * 请求地址
     */
    @Setter(AccessLevel.NONE)
    private String requestAddress;

    /**
     * 专辑
     */
    @Setter(AccessLevel.NONE)
    private Album album;

    /**
     * 集 列表
     */
    @Setter(AccessLevel.NONE)
    public List<Track> trackList = new ArrayList<>();

    /**
     * 第几页，默认第一页
     */
    @Setter(AccessLevel.NONE)
    private Integer pageId = 1;

    /**
     * 要获取的集数，不传则(pageSize = 0)获取全部
     */
    private Integer pageSize = 0;

    /**
     * 总页数
     */
    @Setter(AccessLevel.NONE)
    private Integer maxPageId;

    /**
     * 总集数
     */
    @Setter(AccessLevel.NONE)
    private Integer totalCount = 0;

    /**
     * 获取请求地址
     */
    public String getRequestAddress() {
        return this.getRequestAddress(this.pageId, this.pageSize);
    }

    /**
     * 获取请求地址
     *
     * @param pageId   第几页
     * @param pageSize 要获取的集数
     */
    public String getRequestAddress(Integer pageId, Integer pageSize) {
        StringBuilder sb = new StringBuilder();
        sb.append("https://mobile.ximalaya.com/mobile/v1/album/track/ts-1634744269383?");
        sb.append("albumId=").append(this.albumId);
        sb.append("&device=android&isAsc=true&isQueryInvitationBrand=true");
        sb.append("&pageId=").append(pageId);
        sb.append("&pageSize=").append(pageSize);
        sb.append("&pre_page=0");
        this.requestAddress = sb.toString();
        return this.requestAddress;
    }

    /**
     * 检查 PageSize 以判断是否指定了获取集数
     */
    public String checkPageSize() {
        if (this.pageSize == 0) {
            //获取全部，200是ximalaya限制的单次获取最大值
            return requestAddress = this.getRequestAddress(this.pageId, 200);
        }
        //获取指定数量的集
        return requestAddress = this.getRequestAddress(this.pageId, this.pageSize);
    }

    /**
     * 获取完整的请求结果
     *
     * @return Track列表
     */
    public List<Track> sendRequest() throws Exception {

        if (this.albumId == null) {
            throw new Exception("缺失albumId,现在值为" + this.albumId);
        }

        //获取请求地址
        String requestAddress = checkPageSize();

        //发送请求,获取返回值
        String json = HttpUtils.getJsoupConnection(requestAddress).get().text();

        //在全局 TrackList 中若没有 返回的数据 则追加
        List<Track> tracks = this.parseResponseData(json);
        if (!this.trackList.containsAll(tracks)) {
            this.trackList.addAll(tracks);
        }

        if (this.pageId <= this.maxPageId) {
            System.out.println("正在请求第" + this.pageId + "页内容，共" + this.maxPageId + "页");
            this.pageId++;
            //获取指定数量的集 情况
            if (this.pageSize != 0 && this.trackList.size() == this.pageSize) {
                System.out.println("已经获取了所指定的" + this.pageSize + "集，获取完成 ✔");
                return this.trackList;
            }
            this.sendRequest();
        }

        return this.trackList;
    }

    /**
     * 获取一页请求结果
     *
     * @param pageId 页数ID
     * @return Track列表
     */
    public TreeSet<Track> sendRequest(Integer pageId) {


        return null;
    }

    /**
     * 解析响应的JSON数据
     *
     * @param json Response Json
     * @return Track 列表
     */
    public List<Track> parseResponseData(String json) {

        //获取data节点
        JSONObject data = JSONObject.parseObject(json).getJSONObject("data");

        //获取 List 节点
        JSONArray list = data.getJSONArray("list");
        List<Track> trackList = list.toJavaList(Track.class);

        //创建 Album
        if (this.album == null) {
            this.album = new Album();
            this.album.setAlbumId(this.albumId);
            this.album.setTitle(list.getJSONObject(0).getString("albumTitle"));
        }

        //获取 分页信息
        this.maxPageId = data.getInteger("maxPageId");

        return trackList;
    }

    public Integer getTotalCount() {
        return this.maxPageId * this.getPageSize();
    }
}
